package com.zrrd.learn.chapter06;

import java.util.Arrays;

/**
 * 数据结构
 *
 * @author asus
 * @version 1.0
 * @date 2023/7/14 9:13
 */

/**
 * # 概念
 * 0 信息 ：客观存在的 文本  音频  视频 图像
 * 1 数据 : 是对信息进行加工以后，产生的有价値内容 .
 * 2 数组 :   线性存储结构里面的顺序
 * 3 数据结构 : 用来存储数据的结构
 * # 数据结构 分类
 * 逻辑概念  ： 栈 队列
 * 物理概念  ：
 *
 * # 队列
 * 先进先出  --> 每一个人要排队尾，取数据只能从队首取 ，中间的内容不能直接操作
 * 1 : 底层一定是数组，
 * 2 ： add(int x)  index++
 * 3 : 取出一个数据 0 , 移位问题
 *
 * 细化:
 * 1 : 先要有一个独立的类，用来表示你的逻辑队列的物理代码  QueueForMe.java
 * 2 : 属性
 * 2.1 要有一个数组 整数数组 queueArray
 * 2.2 要有一个下标，表示应该存储的位置 index
 * 2.3 要有一个初始长度 10 default_capacity
 * 2.4 最大长度  max_len
 * 3 ： 方法
 * 3.1 append(int x) 排队,扩容
 * 3.1.1 扩容：index == queueArray.length相等
 * 3.1.2 queueArray 扩容1.5
 * 3.1.3 queueArray[index++]=x;
 * 4.2 取的方法
 * 4.2.1 取头 getHeader() 向前移动
 * 4.3 长度
 */
public class QueueForMe {
    /**
     * 属性
     */
    /**
     * 数组
     */
    private int[]   queueArray={};
    /**
     * 下标,应该存储的位置
     */
    private int index=0;
    /**
     * 初始长度
     */
    private  int default_capacity = 10;
    /**
     * 最大长度
     */
    private int max_len = Integer.MAX_VALUE;

    public QueueForMe(){
//        给数组一个长度
           queueArray=new int[default_capacity];
    }

    public boolean append(int x){
//        扩容长度
        long newarray= queueArray.length + (queueArray.length >> 1);

        int last = newarray > max_len ? max_len : (int) newarray;
//        如果数据长度=数组长度
        if(index==queueArray.length){

            queueArray = Arrays.copyOf(queueArray, last);
        }

        queueArray[index++]=x;

        return true;

    }
    public int getHeader() {
        // 容错  当index=0 ......
//        jdk提供的一个数组拷贝方法
        int t = queueArray[0];
        if(index != 1){
            System.arraycopy(queueArray, 1,queueArray, 0, index - 1);
//                                        把下标为1 的数复制到下标为0 的位置，复制index-1那么长
        }
        index--;
        return t;
    }
    public static void main(String[] args) {
        QueueForMe q = new QueueForMe();
        q.append(1);
        q.append(2);
        q.append(3);

        System.out.println(q.getHeader());
        System.out.println(q.getHeader());
        System.out.println(q.getHeader());
    }


}
